package cn.dkk.create_design.singleton.lazy.dubboCheck;

/**
 * 双重检查锁的饿汉模式,保证了效率以及线程安全
 */
public class LazySingleton {
    /**
     * 由于jvm编译后指令重排序的问题,双重检查锁有可能出现
     * NPE,需要通过volatile来保证有序性和可见性
     */
    private static volatile LazySingleton lazySingleton;

    private LazySingleton(){}

    public static LazySingleton getInstance(){
        // 判断是否有过实例化
        if (lazySingleton==null){
            // 如果有则进入加锁段代码
            synchronized (LazySingleton.class){
                // 再次判断,保证此时其他线程未对于单例实例化
                if (lazySingleton==null){
                    lazySingleton=new LazySingleton();
                }
            }
        }
        return lazySingleton;
    }
}
